package com.itheima.web;

import com.itheima.service.UserService;
import org.springframework.beans.factory.BeanNameAware;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
import org.springframework.util.Assert;

/**
 * 1、BeanNameAware 接口：spring提供一个给bean赋值bean名称一个接口，开发人员也可以通过该接口获取bean名称
 * 2、InitializingBean接口：检查类是否实现了初始化接口，该接口中提供了afterPropertiesSet方法，就会完成初始化逻辑。
 * 3、DisposableBean接口：检查类是否实现了DisposableBean接口,如果实现了，容器关闭之后，就会调用destroy()方法完成资源销毁
 */
public class UserServlet implements BeanNameAware, InitializingBean, DisposableBean {
    private UserService userService;

    public UserServlet() {
        System.out.println("[1]-实例化：调用UserServlet构造函数");
    }

    public void setUserService(UserService userService) {
        System.out.println("[2]-依赖注入属性：set方法给成员赋值" + userService);
        this.userService = userService;
    }

    public void save() {
        userService.save();
        System.out.println("调用目标方法：UserServlet.save");
    }

    @Override
    public void setBeanName(String name) {
        System.out.println("[3]-属性赋值：bean的名称是" + name);
    }

    /**
     * 框架在bean的初始化阶段：一般会对成员变量是否为空进行判断
     *
     * @throws Exception
     */
    @Override
    public void afterPropertiesSet() throws Exception {
        System.out.println("[4]-初始化");
        Assert.notNull(userService, "UserService is required!");
    }

    //用户自定义初始化方法
    private void myInit() {
        System.out.println("自定义初始化方法");
    }

    /**
     * 销毁阶段：框架会在销毁去关闭一些资源
     *
     * @throws Exception
     */
    @Override
    public void destroy() throws Exception {
        System.out.println("[5]-销毁阶段");
        if (userService != null) {
            userService.destroy();
        }
    }

    //自定义销毁方法
    private void myDestroy() {
        System.out.println("自定义销毁方法");
    }
}
